UnityのPath.Combineの挙動で殺意駆動しよう
概要
UnityのPath.Combine関数の挙動がムカつく感じだったので纏めておく。
MacとWindowsで挙動が異なり、というかWindows版だけおもしろおかしい。
以下はすべてWindows版での挙動。
Path.Combine(string a, string b)
a,b2つのstrに対して、a/b のようにパスっぽく繋いで返す。
のだけど、例外的な動作が複数含まれている。
aの終わりが/である場合
var c = Path.Combine(“A/”, “B”);
cには A/B が入る。
aの終わりが/でない場合
var c = Path.Combine(“A”, “B”);
cには A\B が入る。エーバックスラッシュビィーだ。
で、当然のようにUnity内では、
Application.dataPath とかが
C:/somewhere/PROJECT_FOLDER/Assets
とか平然と/で区切ったパスを返してくるので、
ここでAssets下のパスとくっつけようとすると、
var c = Path.Combine(Application.dataPath, “folder/contents”);
c -> C:/somewhere/PROJECT_FOLDER/Assets\folder/contents
とかになる。\が混じる。苦痛だ。地獄か。
第一引数には/で終わるstrをいれないと、Mac/Win両方で動くコードにはならない。おま、、
例えばパスからファイルを読み込んだりする関数があると、こける。
Path.Combine以外にも\が混じるコードがあるようで、Mac/Winでそれらを大量に扱う場合、中間オブジェクトみたいなの用意して
Pathを扱った方が良い気がする。
間違っても/とか\を妄信的にpath delimiterとして使うと詰む。
bの始まりが/である場合
var c = Path.Combine(“A”, “/B”)
こいつは、/Bになる。A? 知らない子ですね、、、
C♯でのPath.Combine(str a, str b)の仕様もこうなので、「ヘェ~ふしぎだけどこういうものなんだな」以外の感想は無い。
きみらフツーはC:とかドライブ指定あるんちゃうんか。
以上から
第一引数の末尾が/か、 また、第二引数の頭が/ではないかどうか、調べて使うと事故が減る。
気に入らん。